/**
 * 姓名测算控制器
 * 处理姓名测算相关的HTTP请求
 */

const NameAnalysisService = require('../services/nameAnalysis.service');
const { logInfo, logError } = require('../logger');

/**
 * 姓名测算主接口
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
async function analyzeName(req, res) {
  try {
    // 从请求体获取参数
    const { name, analysisType } = req.body;
    
    // 参数验证
    if (!name) {
      return res.status(400).json({
        success: false,
        message: '缺少必要的参数：name'
      });
    }
    
    // 记录日志
    logInfo('开始姓名测算', { name, analysisType });
    
    // 调用服务层进行姓名测算
    const analysis = await NameAnalysisService.analyzeName(name, analysisType);
    
    // 如果用户已登录，可以保存记录到数据库
    if (req.user) {
      try {
        // 创建输入参数对象
        const inputParams = {
          name,
          analysisType
        };
        
        // 生成计算哈希（基于输入参数的字符串化）
        const crypto = require('crypto');
        const calculationHash = crypto
          .createHash('md5')
          .update(JSON.stringify(inputParams))
          .digest('hex');
        
        // 保存到数据库的逻辑可以在这里添加
        logInfo('姓名测算记录准备保存', { userId: req.user.id });
      } catch (saveError) {
        logError('姓名测算记录保存准备失败', { error: saveError.message });
        // 不中断主流程，继续返回结果
      }
    }
    
    // 记录日志
    logInfo('姓名测算完成');
    
    // 返回结果
    return res.status(200).json({
      success: true,
      message: '姓名测算成功',
      data: {
        analysis
      }
    });
  } catch (error) {
    // 记录错误日志
    logError('姓名测算接口调用失败', { error: error.message });
    
    // 返回错误响应
    return res.status(500).json({
      success: false,
      message: '服务器内部错误'
    });
  }
}

/**
 * 获取姓名测算结果
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
async function getNameAnalysis(req, res) {
  try {
    // 从请求参数获取ID
    const { id } = req.params;
    
    // 参数验证
    if (!id) {
      return res.status(400).json({
        success: false,
        message: '缺少必要的参数：id'
      });
    }
    
    // 这里应该从数据库获取具体的测算结果
    // 暂时返回模拟数据
    const mockAnalysis = {
      id,
      name: "示例姓名",
      createdAt: new Date().toISOString(),
      analysis: {
        positiveTraits: ["创造力", "沟通力", "同理心"],
        growthSuggestions: ["多参与团队合作", "记录创意想法", "深化同理心"],
        interpretation: "你的名字蕴含着积极的能量，适合发挥你的艺术天赋"
      }
    };
    
    // 记录日志
    logInfo('获取姓名测算结果成功');
    
    // 返回结果
    return res.status(200).json({
      success: true,
      message: '获取姓名测算结果成功',
      data: mockAnalysis
    });
  } catch (error) {
    // 记录错误日志
    logError('获取姓名测算结果失败', { error: error.message });
    
    // 返回错误响应
    return res.status(500).json({
      success: false,
      message: '服务器内部错误'
    });
  }
}

/**
 * 保存姓名测算结果
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
async function saveNameAnalysis(req, res) {
  try {
    // 获取请求参数
    const { name, analysis } = req.body;
    
    // 参数验证
    if (!name || !analysis) {
      return res.status(400).json({
        success: false,
        error: '缺少必要的参数'
      });
    }
    
    // 获取用户ID
    const userId = req.user.id;
    
    // 记录日志
    logInfo('保存姓名测算结果', { userId, name });
    
    // 导入姓名分析模型
    const NameAnalysis = require('../models/NameAnalysis');
    
    // 创建数据库记录
    const savedAnalysis = await NameAnalysis.create({
      name: name,
      positiveTraits: analysis.positiveTraits || [],
      growthSuggestions: analysis.growthSuggestions || [],
      interpretation: analysis.interpretation || '',
      positiveTags: analysis.positiveTags || [],
      userId: userId
    });
    
    // 返回成功响应
    res.status(201).json({
      success: true,
      data: savedAnalysis,
      message: '姓名测算结果保存成功'
    });
  } catch (error) {
    logError('保存姓名测算结果失败', { 
      error: error.message,
      userId: req.user.id
    });
    
    res.status(500).json({
      success: false,
      error: '保存姓名测算结果失败'
    });
  }
}

/**
 * 获取用户的姓名测算记录
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
async function getUserNameAnalyses(req, res) {
  try {
    // 获取用户ID
    const userId = req.user.id;
    
    // 记录日志
    logInfo('获取用户姓名测算记录', { userId });
    
    // 导入姓名分析模型
    const NameAnalysis = require('../models/NameAnalysis');
    
    // 从数据库获取用户的测算记录
    const analyses = await NameAnalysis.findAll({
      where: {
        userId: userId
      },
      order: [['createdAt', 'DESC']], // 按创建时间倒序排列
      limit: 50 // 限制返回最多50条记录
    });
    
    // 返回成功响应
    res.json({
      success: true,
      data: analyses,
      message: '获取用户姓名测算记录成功'
    });
  } catch (error) {
    logError('获取用户姓名测算记录失败', { 
      error: error.message,
      userId: req.user.id
    });
    
    res.status(500).json({
      success: false,
      error: '获取用户姓名测算记录失败'
    });
  }
}

module.exports = {
  analyzeName,
  getNameAnalysis,
  saveNameAnalysis,
  getUserNameAnalyses
};